[XEN] Cleanups to phys/mach address handling.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Mon, 27 Nov 2006 14:20:44 +0000 (14:20 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Mon, 27 Nov 2006 14:20:44 +0000 (14:20 +0000)
 1. Balloon driver does not need to set M2P entry.
    This is done by the populate_physmap hypercall.

 2. Xen now translates foreign mappings from GMFN->MFN.
    Tools are simplified because of this.

Signed-off-by: Keir Fraser <keir@xensource.com>
12 files changed:
linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c
linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h
linux-2.6-xen-sparse/include/asm-ia64/maddr.h
tools/ioemu/vl.c
tools/libxc/xc_domain.c
tools/libxc/xc_hvm_build.c
tools/libxc/xc_linux_build.c
tools/libxc/xc_linux_restore.c
tools/libxc/xc_private.c
tools/libxc/xenctrl.h
xen/arch/x86/mm.c

index 7263ef4dea3a00b1846088d51fe08b51ae2811f2..3c20351e92fa870cd17ce80e77674af76332a3e3 100644 (file)
@@ -99,18 +99,6 @@ void xen_l4_entry_update(pgd_t *ptr, pgd_t val)
 }
 #endif /* CONFIG_X86_64 */
 
-void xen_machphys_update(unsigned long mfn, unsigned long pfn)
-{
-       mmu_update_t u;
-       if (xen_feature(XENFEAT_auto_translated_physmap)) {
-               BUG_ON(pfn != mfn);
-               return;
-       }
-       u.ptr = ((unsigned long long)mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
-       u.val = pfn;
-       BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
-}
-
 void xen_pt_switch(unsigned long ptr)
 {
        struct mmuext_op op;
index ae15fd4ef738f77da4ff063f06d0deec906661fc..b621d763839b976c4ce97b89ed9d7a5e196b3af0 100644 (file)
@@ -215,9 +215,7 @@ static int increase_reservation(unsigned long nr_pages)
                BUG_ON(!xen_feature(XENFEAT_auto_translated_physmap) &&
                       phys_to_machine_mapping_valid(pfn));
 
-               /* Update P->M and M->P tables. */
                set_phys_to_machine(pfn, frame_list[i]);
-               xen_machphys_update(frame_list[i], pfn);
 
                /* Link back into the page tables if not highmem. */
                if (pfn < max_low_pfn) {
index ef82d357283c5f4549bbf37300356bf4193e223d..f7904ac0b078d1289ffcfed9ccb96468919325e7 100644 (file)
@@ -98,7 +98,6 @@ void xen_pgd_pin(unsigned long ptr);
 void xen_pgd_unpin(unsigned long ptr);
 
 void xen_set_ldt(unsigned long ptr, unsigned long bytes);
-void xen_machphys_update(unsigned long mfn, unsigned long pfn);
 
 #ifdef CONFIG_SMP
 #include <linux/cpumask.h>
index 7a26b2c6cc51f033a7e9cc7000da193c6fa1fd95..cbdef5a96ece2ba9eaebfc28e80ed39c9306c8d5 100644 (file)
@@ -96,11 +96,6 @@ mfn_to_local_pfn(unsigned long mfn)
 #define virt_to_machine(virt) __pa(virt) // for tpmfront.c
 
 #define set_phys_to_machine(pfn, mfn) do { } while (0)
-#ifdef CONFIG_VMX_GUEST
-extern void xen_machphys_update(unsigned long mfn, unsigned long pfn);
-#else /* CONFIG_VMX_GUEST */
-#define xen_machphys_update(mfn, pfn) do { } while (0)
-#endif /* CONFIG_VMX_GUEST */
 
 typedef unsigned long maddr_t; // to compile netback, netfront
 
index 7d41a39299d96bc6ef6888f382009a18d1971586..a2700ef31353a50b21daee8b3fc313f1afeed12e 100644 (file)
@@ -5787,9 +5787,6 @@ int set_mm_mapping(int xc_handle, uint32_t domid,
                    unsigned long nr_pages, unsigned int address_bits,
                    xen_pfn_t *extent_start)
 {
-#if 0
-    int i;
-#endif
     xc_dominfo_t info;
     int err = 0;
 
@@ -5808,19 +5805,6 @@ int set_mm_mapping(int xc_handle, uint32_t domid,
         return -1;
     }
 
-    err = xc_domain_translate_gpfn_list(xc_handle, domid, nr_pages,
-                                        extent_start, extent_start);
-    if (err) {
-        fprintf(stderr, "Failed to translate gpfn list\n");
-        return -1;
-    }
-
-#if 0 /* Generates lots of log file output - turn on for debugging */
-    for (i = 0; i < nr_pages; i++)
-        fprintf(stderr, "set_map result i %x result %lx\n", i,
-                extent_start[i]);
-#endif
-
     return 0;
 }
 
@@ -6425,12 +6409,6 @@ int main(int argc, char **argv)
 #if defined(__i386__) || defined(__x86_64__)
     for ( i = 0; i < tmp_nr_pages; i++)
         page_array[i] = i;
-    if (xc_domain_translate_gpfn_list(xc_handle, domid, tmp_nr_pages,
-                                      page_array, page_array)) {
-        fprintf(logfile, "xc_domain_translate_gpfn_list returned error %d\n",
-                errno);
-        exit(-1);
-    }
 
     phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
                                          PROT_READ|PROT_WRITE, page_array,
index ae2b9f6221d3c5473580e4c04fd1aba5e9d316a4..b63e172a2201ac3d95eed2cac057867d6e42d85e 100644 (file)
@@ -430,22 +430,6 @@ int xc_domain_memory_populate_physmap(int xc_handle,
     return err;
 }
 
-int xc_domain_translate_gpfn_list(int xc_handle,
-                                  uint32_t domid,
-                                  unsigned long nr_gpfns,
-                                  xen_pfn_t *gpfn_list,
-                                  xen_pfn_t *mfn_list)
-{
-    struct xen_translate_gpfn_list op = {
-        .domid        = domid,
-        .nr_gpfns     = nr_gpfns,
-    };
-    set_xen_guest_handle(op.gpfn_list, gpfn_list);
-    set_xen_guest_handle(op.mfn_list, mfn_list);
-
-    return xc_memory_op(xc_handle, XENMEM_translate_gpfn_list, &op);
-}
-
 int xc_domain_max_vcpus(int xc_handle, uint32_t domid, unsigned int max)
 {
     DECLARE_DOMCTL;
index fe301207f13ef921391104bb551c012e8a5147ab..4a0e884841aa50d453f7a9d127683de6b01a8c22 100644 (file)
@@ -245,13 +245,6 @@ static int setup_guest(int xc_handle,
         goto error_out;
     }
 
-    if ( xc_domain_translate_gpfn_list(xc_handle, dom, nr_pages,
-                                       page_array, page_array) )
-    {
-        PERROR("Could not translate addresses of HVM guest.\n");
-        goto error_out;
-    }
-
     loadelfimage(image, xc_handle, dom, page_array, &dsi);
 
     if ( set_hvm_info(xc_handle, dom, page_array, vcpus, acpi) )
index 9c03f067e7751ee6f60ed1c34395a8257659ed43..9bd4a5e3f4802c307415f2771e4d5fdaf9b039ab 100644 (file)
@@ -509,12 +509,6 @@ static int setup_guest(int xc_handle,
         PERROR("Could not allocate memory for PV guest.\n");
         goto error_out;
     }
-    if ( xc_domain_translate_gpfn_list(xc_handle, dom, nr_pages,
-                                       page_array, page_array) )
-    {
-        PERROR("Could not translate addresses of PV guest.\n");
-        goto error_out;
-    }
 
     dsi.v_start    = round_pgdown(dsi.v_start);
     vinitrd_start  = round_pgup(dsi.v_end);
index c31a1bdb7c979dba1ee84423e7ed5f3dc304d085..1d28226bd6642f98973c930fe7e1dd992ced03e7 100644 (file)
@@ -265,13 +265,16 @@ int xc_linux_restore(int xc_handle, int io_fd,
     }
     shared_info_frame = domctl.u.getdomaininfo.shared_info_frame;
 
-    if(xc_domain_setmaxmem(xc_handle, dom, PFN_TO_KB(max_pfn)) != 0) {
+    if (xc_domain_setmaxmem(xc_handle, dom, PFN_TO_KB(max_pfn)) != 0) {
         errno = ENOMEM;
         goto out;
     }
 
-    if(xc_domain_memory_increase_reservation(
-           xc_handle, dom, max_pfn, 0, 0, NULL) != 0) {
+    for ( pfn = 0; pfn < max_pfn; pfn++ )
+        p2m[pfn] = pfn;
+
+    if (xc_domain_memory_populate_physmap(xc_handle, dom, max_pfn,
+                                          0, 0, p2m) != 0) {
         ERROR("Failed to increase reservation by %lx KB", PFN_TO_KB(max_pfn));
         errno = ENOMEM;
         goto out;
@@ -279,18 +282,11 @@ int xc_linux_restore(int xc_handle, int io_fd,
 
     DPRINTF("Increased domain reservation by %lx KB\n", PFN_TO_KB(max_pfn));
 
-    /* Build the pfn-to-mfn table. We choose MFN ordering returned by Xen. */
-    if (xc_get_pfn_list(xc_handle, dom, p2m, max_pfn) != max_pfn) {
-        ERROR("Did not read correct number of frame numbers for new dom");
-        goto out;
-    }
-
     if(!(mmu = xc_init_mmu_updates(xc_handle, dom))) {
         ERROR("Could not initialise for MMU updates");
         goto out;
     }
 
-
     DPRINTF("Reloading memory pages:   0%%\n");
 
     /*
index a2600fdc1b6fa21b0e4e6fc5ed834361998d099f..d8dbb5e0ddf53ffd72eb25412cfc6178f8aa0407 100644 (file)
@@ -134,10 +134,7 @@ int xc_memory_op(int xc_handle,
     DECLARE_HYPERCALL;
     struct xen_memory_reservation *reservation = arg;
     struct xen_machphys_mfn_list *xmml = arg;
-    struct xen_translate_gpfn_list *trans = arg;
     xen_pfn_t *extent_start;
-    xen_pfn_t *gpfn_list;
-    xen_pfn_t *mfn_list;
     long ret = -EINVAL;
 
     hypercall.op     = __HYPERVISOR_memory_op;
@@ -186,28 +183,6 @@ int xc_memory_op(int xc_handle,
             goto out1;
         }
         break;
-    case XENMEM_translate_gpfn_list:
-        if ( lock_pages(trans, sizeof(*trans)) != 0 )
-        {
-            PERROR("Could not lock");
-            goto out1;
-        }
-        get_xen_guest_handle(gpfn_list, trans->gpfn_list);
-        if ( lock_pages(gpfn_list, trans->nr_gpfns * sizeof(xen_pfn_t)) != 0 )
-        {
-            PERROR("Could not lock");
-            unlock_pages(trans, sizeof(*trans));
-            goto out1;
-        }
-        get_xen_guest_handle(mfn_list, trans->mfn_list);
-        if ( lock_pages(mfn_list, trans->nr_gpfns * sizeof(xen_pfn_t)) != 0 )
-        {
-            PERROR("Could not lock");
-            unlock_pages(gpfn_list, trans->nr_gpfns * sizeof(xen_pfn_t));
-            unlock_pages(trans, sizeof(*trans));
-            goto out1;
-        }
-        break;
     }
 
     ret = do_xen_hypercall(xc_handle, &hypercall);
@@ -232,13 +207,6 @@ int xc_memory_op(int xc_handle,
     case XENMEM_add_to_physmap:
         unlock_pages(arg, sizeof(struct xen_add_to_physmap));
         break;
-    case XENMEM_translate_gpfn_list:
-            get_xen_guest_handle(mfn_list, trans->mfn_list);
-            unlock_pages(mfn_list, trans->nr_gpfns * sizeof(xen_pfn_t));
-            get_xen_guest_handle(gpfn_list, trans->gpfn_list);
-            unlock_pages(gpfn_list, trans->nr_gpfns * sizeof(xen_pfn_t));
-            unlock_pages(trans, sizeof(*trans));
-        break;
     }
 
  out1:
index 42b09323a7a3182d67e5e844fb8e93a8dc7b32a3..c646d18ea8c9cf0a020dca133a4040ccaedfffc3 100644 (file)
@@ -439,12 +439,6 @@ int xc_domain_memory_populate_physmap(int xc_handle,
                                       unsigned int address_bits,
                                       xen_pfn_t *extent_start);
 
-int xc_domain_translate_gpfn_list(int xc_handle,
-                                  uint32_t domid,
-                                  unsigned long nr_gpfns,
-                                  xen_pfn_t *gpfn_list,
-                                  xen_pfn_t *mfn_list);
-
 int xc_domain_ioport_permission(int xc_handle,
                                 uint32_t domid,
                                 uint32_t first_port,
index c7dc88d503b25aec6f7549a8d02974f32290d3fc..b87bc97c5ba78863d6c5898f106e0b9c11af18b3 100644 (file)
@@ -1240,6 +1240,10 @@ static int mod_l1_entry(l1_pgentry_t *pl1e, l1_pgentry_t nl1e,
 
     if ( l1e_get_flags(nl1e) & _PAGE_PRESENT )
     {
+        /* Translate foreign guest addresses. */
+        nl1e = l1e_from_pfn(gmfn_to_mfn(FOREIGNDOM, l1e_get_pfn(nl1e)),
+                            l1e_get_flags(nl1e));
+
         if ( unlikely(l1e_get_flags(nl1e) & L1_DISALLOW_MASK) )
         {
             MEM_LOG("Bad L1 flags %x",
@@ -1814,12 +1818,17 @@ static int set_foreigndom(domid_t domid)
     if ( likely(domid == DOMID_SELF) )
         goto out;
 
-    if ( domid == d->domain_id )
+    if ( unlikely(domid == d->domain_id) )
     {
         MEM_LOG("Dom %u tried to specify itself as foreign domain",
                 d->domain_id);
         okay = 0;
     }
+    else if ( unlikely(shadow_mode_translate(d)) )
+    {
+        MEM_LOG("Cannot mix foreign mappings with translated domains");
+        okay = 0;
+    }
     else if ( !IS_PRIV(d) )
     {
         switch ( domid )
@@ -1857,14 +1866,6 @@ static int set_foreigndom(domid_t domid)
         }
     }
 
-    if ( unlikely(shadow_mode_translate(d)) )
-    {
-        MEM_LOG("%s: can not mix foreign mappings with translated domains",
-                __func__);
-        info->foreign = NULL;
-        okay = 0; 
-    }
-
  out:
     return okay;
 }
@@ -2340,13 +2341,15 @@ int do_mmu_update(
                 break;
             }
 
-            if ( shadow_mode_translate(FOREIGNDOM) )
-                shadow_guest_physmap_add_page(FOREIGNDOM, gpfn, mfn);
-            else 
-                set_gpfn_from_mfn(mfn, gpfn);
+            if ( unlikely(shadow_mode_translate(FOREIGNDOM)) )
+            {
+                MEM_LOG("Mach-phys update on shadow-translate guest");
+                break;
+            }
+
+            set_gpfn_from_mfn(mfn, gpfn);
             okay = 1;
 
-            // Mark the new gfn dirty...
             mark_dirty(FOREIGNDOM, mfn);
 
             put_page(mfn_to_page(mfn));
@@ -2557,10 +2560,7 @@ static int destroy_grant_va_mapping(
     }
     ol1e = *pl1e;
 
-    /*
-     * Check that the virtual address supplied is actually mapped to
-     * frame.
-     */
+    /* Check that the virtual address supplied is actually mapped to frame. */
     if ( unlikely(l1e_get_pfn(ol1e) != frame) )
     {
         MEM_LOG("PTE entry %lx for address %lx doesn't match frame %lx",
@@ -2574,7 +2574,7 @@ static int destroy_grant_va_mapping(
     {
         MEM_LOG("Cannot delete PTE entry at %p", (unsigned long *)pl1e);
         rc = GNTST_general_error;
-        goto out; // this is redundant & unnecessary, but informative
+        goto out;
     }
 
  out: